-- Desc: 订单退款还原库存记录
-- 由于redis没有事务，如果这里直接回退库存后，又出现mysql事务回滚，就会导致还原了多余的库存，在定时任务处理之前，刚好有用户购买此商品，会出现超卖的问题
-- 所以只添加库存变更的记录，并不实际修改库存
-- mall4j_product:order_refund_time: 最后一次退款记录操作，RefundStockHandle.lua只对最后一次操作，且退款成功的退款库存进行还原（退款成功操作只能进行一次）
-- mall4j_product:order_refund_lock_list： 数据格式{refundId_refundTime, refundId_refundTime,......} 退款订单操作列表, 用于定时任务处理退款操作失败或者事务回滚的处理
-- mall4j_product:order_refund_sku_lock: 要还原库存的实际退款sku记录，用于RefundStockHandle.lua还原库存时的幂等


-- ================ 以下为函数， 不属于主流程 ================
local function containsValue(list, value)
    for i = 1, #list do
        if list[i] == value then
            return false
        end
    end
    return true
end

-- ================ 开始提交订单锁定库存流程 ================
local params = {}
local refundId = ""
local time = ""
local msetSkuKV = {}
-- 步骤一    入参 KEYS skuId_退款数量_库存id_退款id_时间   skuId_退款数量_库存id_退款id_时间...
for index, paramStr in ipairs(KEYS) do
    -- {skuId, 退款数量, 库存id}
    local param = {}
    for value in string.gmatch(paramStr, "%d+") do
        table.insert(param, value)
    end
    table.insert(params, param)
    if refundId == "" then
        refundId = param[4]
        time = param[5]
    end

    -- 添加库存锁定记录 退款id_skuId_库存id
    table.insert(msetSkuKV,"mall4j_product:order_refund_sku_lock:"..param[4].."_"..param[1].."_"..param[3].."_"..param[5])
    table.insert(msetSkuKV, param[2])
end

redis.call('rpush', "mall4j_product:order_refund_lock_list", refundId.."_"..time)
-- 退款操作时间，由于有事务，所以这里的时间戳不可能相等，代表该退款id对应的最后一次库存操作
table.insert(msetSkuKV,"mall4j_product:order_refund_time:"..refundId)
table.insert(msetSkuKV, time)
-- 修改回redis
redis.call('mset',unpack(msetSkuKV))


